def genDept(ruleDatum, ruleAct, filterDatum, hsp_abbr):

    # 获取filterDatum中的value
    valueList = filterDatum['value']

    # 获取filterDatum中的operator，直接获取，没有就报错
    operator = filterDatum['operator']
    if operator not in ['include', 'exclude']:
        raise ValueError(f"filterDatum 中 operator 字段值只能是 'include' 或 'exclude'，当前值为 {operator}。")
    # operStr ，如果是保留违规的就用 keep，如果是删除违规的就用 drop
    operKeepStr = 'NOT ' if operator == 'exclude' else ''
    operDropStr = '' if operator == 'exclude' else 'NOT '

    # 获取filterDatum中的of, 默认是 ['default']
    of = filterDatum.get('of', ['default'])
    if 'default' in of:
        if operator == 'include':
            of = ['item_dept']
        else:
            of = ['item_dept', 'in_dept', 'out_dept', 'apply_dept']
    """
    ============ 思路 ============
    1. 如果 of 中有 in_dept，则关联 m，删除 va 不符合的部分
    2. 如果 of 中有 out_dept，则关联 m，删除 va 不符合的部分
    3. 如果 of 中有 item_dept，则关联 d，删除 va 不符合的部分
    4. 排除掉 in_dept, out_dept, item_dept 都为空的部分

    ============ 参数 ============
    ● operator：include，exclude
    ● of：默认 ['default']，也可以手动指定 'in_dept', 'out_dept', 'item_dept'。列表中的所有元素都符合条件才违规
        ○ 默认情况下，如果 operator = include，则 item_dept 名称包含就违规
        ○ 默认情况下，如果 operator = exclude，则 item_dept, in_dept, out_dept 三者都不包含才违规
    ● value：值
    """

    # 构建sqlList
    sqlList = []
    
    # step1，关联 m，删除不符合 in_dept 条件的部分
    if 'in_dept' in of:
        sql1 = f"""
            -- dept，step1，关联 m，删除不符合 in_dept 条件的部分
            DELETE from vlt_tmp_a va
            WHERE {operDropStr} EXISTS (
                SELECT 1 FROM m
                WHERE va.setl_id = m.setl_id AND (
                    {' OR '.join([f"m.in_dept LIKE '%{val}%'" for val in valueList])}
                )
            )
        """
        sqlList.append(sql1)
    
    # step2，关联 m，删除不符合 out_dept 条件的部分
    if 'out_dept' in of:
        sql2 = f"""
            -- dept，step2，关联 m，删除不符合 out_dept 条件的部分
            DELETE from vlt_tmp_a va
            WHERE {operDropStr} EXISTS (
                SELECT 1 FROM m
                WHERE va.setl_id = m.setl_id AND (
                    {' OR '.join([f"m.out_dept LIKE '%{val}%'" for val in valueList])}
                )
            )
        """
        sqlList.append(sql2)
    
    # step3，关联 d，删除不符合 item_dept 条件的部分
    if 'item_dept' in of:
        sql3 = f"""
            -- dept，step3，关联 d，删除不符合 item_dept 条件的部分
            DELETE from vlt_tmp_a va
            WHERE {operDropStr} (
                {' OR '.join([f"va.item_dept LIKE '%{val}%'" for val in valueList])}
            )
        """
        sqlList.append(sql3)
    
    # step3b，关联 d，删除不符合 apply_dept 条件的部分
    if 'apply_dept' in of:
        sql3b = f"""
            -- dept，step3b，关联 d，删除不符合 apply_dept 条件的部分
            DELETE from vlt_tmp_a va
            WHERE {operDropStr} (
                {' OR '.join([f"va.apply_dept LIKE '%{val}%'" for val in valueList])}
            )
        """
        sqlList.append(sql3b)
    
    # step4，排除掉 in_dept, out_dept, item_dept, apply_dept 都为空的部分
    sql4 = f"""
        -- dept，step4，排除掉 in_dept, out_dept, item_dept, apply_dept 都为空的部分
        DELETE from vlt_tmp_a va
        WHERE NOT (
            (va.item_dept IS NOT NULL AND va.item_dept <> '')
            OR
            (va.apply_dept IS NOT NULL AND va.apply_dept <> '')
            OR
            EXISTS (
                SELECT 1 FROM m
                WHERE va.setl_id = m.setl_id AND (
                    (m.in_dept IS NOT NULL AND m.in_dept <> '')
                    OR
                    (m.out_dept IS NOT NULL AND m.out_dept <> '')
                )
            )
        )
    """
    sqlList.append(sql4)

    return sqlList
